package com.maven.booksystem.controller;


import com.maven.booksystem.constants.Constants;
import com.maven.booksystem.model.*;
import com.maven.booksystem.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    // 这里仅仅是 做到了从数据库获取数据，并没有实现 翻页的 功能
/*    @RequestMapping("/getList")
    public List<BookInfo> getList() {

        List<BookInfo> list=bookService.getAllBook();
        bookService.checkState(list);

        for(BookInfo book:list){
            System.out.println(book);
        }

        return list;
    }*/

    // 这里 由于 是 String 类型，返回前端后也是 String ，所以我们需要 换类型
    @RequestMapping(value = "/insertBook",produces = "application/json")
    public String insertBook(BookInfo bookInfo) {
        log.info("添加的书籍, bookInfo:{}", bookInfo);
        if (!StringUtils.hasLength(bookInfo.getBookName())
                || !StringUtils.hasLength(bookInfo.getAuthor())
                || bookInfo.getCount()<=0
                || bookInfo.getPrice()==null
                || !StringUtils.hasLength(bookInfo.getPublish())){
            return "参数错误";
        }
        //添加图书
        try {
            Integer n=bookService.insertBook(bookInfo);
            if(n<=0) return "添加失败";
            return "success";
        }catch (Exception e){
            log.error("添加图书失败, e:{}",e.toString());
            return "内部发生错误, 请联系管理员";
        }
    }


/*    @RequestMapping("/getListByPage")
    public PageResult getListByPage(PageInfo pageInfo) {
        log.info("查询列表信息, pageRequest:{}", pageInfo);

        PageResult result = bookService.getBookByPage(pageInfo);

        log.info("接收到的 pageResult:{}",result);
        return result;
    }*/

    // 现在我们来做 强制登陆
    // 传统版：
    @RequestMapping("/getListByPage")
    // 首先，我们 应该从 session 中 获取信息
    public ResultInfo getListByPage(PageInfo pageInfo, HttpSession session) {
        // 这里 是从 session 中 获取 我们 登陆时存储的 用户信息
        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);
        if (userInfo==null || userInfo.getId()<1){
            /*ResultInfo result = new ResultInfo();
            result.setCode(-1);*/

            // 这里表示 未查询到用户信息,未登录 ：
            // 但是这里可能就存在一些问题：我们 未登录传的 是 null， 查询到空数据也是 null ，那前端如何识别呢
            // 所以我们就需要创建一个 专门的 类来进行区分
            log.info("未查询到用户信息，请登录");
            return ResultInfo.unlogin();
        }
        log.info("查询列表信息, pageRequest:{}", pageInfo);

        PageResult pageresult = bookService.getBookByPage(pageInfo);

/*        ResultInfo result = new ResultInfo();
        result.setCode(200);
        result.setRecord(pageresult);
        log.info("接收到的 ResultInfo:{}",result);
*/
        log.info(pageresult.toString());
        return ResultInfo.success(pageresult);
    }

    // 传统的 强制登录 会导致 每个 controller 里面都需要 重复上述步骤（无法简化了），
    // spring 中的强制 登录： 拦截器



    @RequestMapping("/getBookById")
    public BookInfo getBookById(int bookId) {

        return bookService.getBookById(bookId);
    }

    //  修改 图书 与 删除
    @RequestMapping("/updateBook")
    public boolean updateBook(BookInfo bookInfo) {
        log.info("更新的 图书是：{}",bookInfo);
        // 这里主要是 看 这本书存在不
        if (bookInfo.getId() ==null || bookInfo.getId() <= 0){
            return false;
        }
        try{
            Integer n = bookService.updateBook(bookInfo);
            if(n <= 0)
                return false;
            return true;
        }catch (Exception e){
            log.info("出现错误：e:{}",e);
        }
        return false;
    }


    @RequestMapping("/batchDelete")
    public boolean batchDelete(@RequestParam(name = "ids") List<Integer> ids) {
        log.info("需要删除的 ids:{}",ids);
        try{
            Integer n= bookService.batchDelete(ids);
            if(n<=0)
                return false;
            return true;
        }catch (Exception e){
            log.info("内部错误e:{}",e);
        }
        return false;
    }
}
